#include "adc.h"
/*
这个ADC是软件查询方式实现的没有使用中断查询
*/
void PB0_ADC_Init(void)
{
	ADC_InitTypeDef ADC_structure; //定义一下初始化结构体
	GPIO_InitTypeDef gpio_structure;
	
	//开启相关时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_ADC1, ENABLE);
	RCC_ADCCLKConfig(RCC_PCLK2_Div6);//配置ADC时钟
	
	gpio_structure.GPIO_Mode = GPIO_Mode_AIN; //将引脚模式配置为模拟输入模式
	gpio_structure.GPIO_Speed = GPIO_Speed_50MHz;
	gpio_structure.GPIO_Pin = GPIO_Pin_0;
	GPIO_Init(GPIOB, &gpio_structure);
	
	//只使用一个ADC，属于独立模式
	ADC_structure.ADC_Mode = ADC_Mode_Independent;
	//禁止扫描模式，多通道才要，单通道不需要
	ADC_structure.ADC_ScanConvMode = DISABLE;
	//使能连续转换模式
	ADC_structure.ADC_ContinuousConvMode =ENABLE;
	//不用外部触发转换，软件开启即可
	ADC_structure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
	//结果右对齐
	ADC_structure.ADC_DataAlign = ADC_DataAlign_Right;
	//转换通道一个
	ADC_structure.ADC_NbrOfChannel = 1;
	//初始化ADC
	ADC_Init(ADC1, &ADC_structure);
	
	//使能ADC
	ADC_Cmd(ADC1, ENABLE);
	//初始化ADC校准寄存器
	ADC_ResetCalibration(ADC1);
	//等待ADC校准寄存器初始化完毕
	while(ADC_GetResetCalibrationStatus(ADC1) == 1);
	//校准ADC
	ADC_StartCalibration(ADC1);
	//等待校准完成
	while(ADC_GetCalibrationStatus(ADC1) == 1);
}

float get_adcVal(void)
{
	float temp;
	//配置通道转换顺序，第一个转换，采样时间
	ADC_RegularChannelConfig(ADC1, ADC_Channel_8,1, ADC_SampleTime_239Cycles5);
	//开始转换
	ADC_SoftwareStartConvCmd(ADC1, ENABLE);
	//等待转换完成
	while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == 0);
	//获取ADC值
	temp = ADC_GetConversionValue(ADC1);
	//标度变换
	temp = 3.3 / 4096 * temp;
	return temp;
}

